VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "ClsFactura"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

Public WithEvents orset As ClsRecordset
Attribute orset.VB_VarHelpID = -1

Public Event DataChanged()

Public codigo As String
Public codNodo As String
'Public codGestion As String
Public codSucursal As String
Public codCobrador As String
'Public codCliente As String
'Public codServicio As String
'Public codCuenta As String 'agregado para saber la cuenta contable de la factura
'ahora mediante la tabla de cuentas/servicios podemos saber a que cuenta cancela en diferentes gestiones

Public fecha As String
Public numero As String
Public codControl As String
Public nroautorizacion As String
Public nit As String
Public razon As String
Public concepto As String
Public importe As Double
Public fecha_limite As String
Public anulada As Boolean
Public fecha_reporte As String
Public cancelada As Boolean
Public observaciones As String
Public impresa As Boolean

Private Sub Class_Initialize()
    Set orset = New ClsRecordset
    orset.setCampos dbCampos(fac)
    orset.setTablas Array(fac)
End Sub
Private Sub Class_Terminate()
    Set orset = Nothing
End Sub
Public Sub consulta()
    orset.consulta
End Sub
Public Sub consultaDatos(codig As String)
    orset.consulta Array(fac_id & "='" & codig & "'")
End Sub

Public Sub consultaXNumeroSucursalGestion(optNumero As String, optCodSucursal As String, optCodGestion As String)
    orset.consultaGral concatenaVectores(Array(fac_id, _
                             formatFechaSQL(fac_fecha) & " as fecha2", _
                             fac_numero, fac_nit, fac_razon, fac_importe, _
                             BooleanToSiNoSql(fac_cancelada, True)), dbCampos(fac)), _
                       Array(fac, tra, cue), _
                       Array(tra_fac_id & "=" & fac_id, _
                             tra_cue_id & "=" & cue_id, _
                             cue_tpt_id & "=2", _
                             fac_sfa_id & "=" & optCodSucursal, _
                             cue_ges_id & "=" & optCodGestion, _
                             fac_numero & "='" & optNumero & "'"), _
                       Array(fac_fecha & " ASC")
End Sub

Public Sub consultaXNumeroYSucursal(numFactura As String, codSucFacturacion As String)
    orset.consultaGral , Array(fac, sfa, dsf), _
                       Array(fac_numero & "='" & numFactura & "'", _
                             sfa_id & "=" & codSucFacturacion _
                             )
End Sub
'TODO: revisar funcionamiento correcto
Public Function existe(optNumOrdenAut As String, optNumero As String) As Boolean
    'busca si una factura ya ha sido emitida anteriormente
    'si es que se encontrara, tiene ser en anteriores gestiones (solo UN registro por gestion)
    'y todos los registros tiene que estar por cobrar
    existe = False
    orset.consultaGral , Array(fac, tra, cue), _
                       Array(tra_fac_id & "=" & fac_id, _
                             tra_cue_id & "=" & cue_id, _
                             cue_tpt_id & "=4", _
                             fac_nroautorizacion & "='" & optNumOrdenAut & "'", _
                             fac_numero & "='" & optNumero & "'"), _
                       Array(cue_ges_id & " DESC", fac_fecha & " DESC")
    If orset.numRegistros > 0 Then
        existe = True
    End If
End Function
Public Function consultaMaxFacDsf(CodDosif As String)
    Dim dosif As ClsDosificacion
    Set dosif = New ClsDosificacion
    dosif.consultaDatos CodDosif
    orset.consultaGral Array("max(" & fac_numero & ") as ultimafactura"), _
                       Array(fac, dsf), _
                       Array(fac_nroautorizacion & "=" & dsf_autorizacion, _
                             dsf_id & "='" & CodDosif & "'"), , False
    If orset.numRegistros > 0 Then
        If orset.getDato("ultimafactura", "") <> "" Then
            If dosif.numero_inicial > Val(orset.getDato("ultimafactura", 0)) Then
                consultaMaxFacDsf = dosif.numero_inicial - 1
            Else
                consultaMaxFacDsf = orset.getDato("ultimafactura", 0)
            End If
        Else
            consultaMaxFacDsf = dosif.numero_inicial - 1
        End If
    Else
        consultaMaxFacDsf = dosif.numero_inicial - 1
    End If
End Function
Public Function consultaCuentaXDosificacion(CodDosif As String)
    orset.consultaGral Array("count(*) as cuenta"), _
                       Array(fac, dsf), _
                       Array(fac_nroautorizacion & "=" & dsf_autorizacion, _
                             dsf_id & "='" & CodDosif & "'"), , False
    consultaCuentaXDosificacion = orset.getDato("cuenta")
End Function

Public Sub consultaXDocumento(codDocumento As String)
    orset.consultaGral , Array(fac, tra, cue, trd), _
                       Array(tra_fac_id & "=" & fac_id, _
                             tra_cue_id & "=" & cue_id, _
                             trd_tra_id & "=" & tra_id, _
                             trd_doc_id & "='" & codDocumento & "'", _
                             cue_tpt_id & "=2"), , True
End Sub

Public Sub buscar(nroFactura As String, fechaFactura As String, facImporte As String)
    orset.consulta Array(fac_numero & "='" & nroFactura & "'", _
                         fac_fecha & "='" & fechaFactura & "'", _
                         fac_importe & "=" & facImporte)
End Sub
Public Sub BuscarNumeroYAutorizacion(nroFactura As String, nroautorizacion As String)
    orset.consulta Array(fac_numero & "='" & nroFactura & "'", _
                         fac_nroautorizacion & "='" & nroautorizacion & "'")
End Sub

Public Function estaImpresa(Optional codig As String)
    If codig <> "" Then
        Me.consultaDatos codig
    End If
    estaImpresa = Me.impresa
End Function

Public Sub imprimir(imprim As Boolean, Optional codig As String)
    If codig <> "" Then
        Me.codigo = codig
    End If
    orset.sUpdateGral Array(fac_impresa), _
                      Array(BooleanToString(imprim)), _
                      Array(fac), _
                      Array(fac_id & "='" & Me.codigo & "'"), False
    Me.impresa = imprim
End Sub

Public Sub AsignaAbono(abonoCod As String)
    orset.sUpdateGral Array(tra_fac_id), _
                      Array(Me.codigo), _
                      Array(tra), _
                      Array(tra_id & "='" & abonoCod & "'"), False
End Sub

Public Sub anular(codig As String)
    '//TODO revisar funcionamiento
    Dim i As Integer
    
    Dim pago As ClsPago
    Set pago = New ClsPago
    
    Dim sq As ClsSQL
    Set sq = New ClsSQL
    Dim q As ClsQuery
    Set q = New ClsQuery
    Dim qAux As ClsQuery
    Set qAux = New ClsQuery
    Dim qCar As ClsQuery
    Set qCar = New ClsQuery
    Dim qAbo As ClsQuery
    Set qAbo = New ClsQuery
    Dim condsCar As String
    Dim cargo As ClsMov
    Dim abono As ClsMov
    Set cargo = New ClsMov
    Set abono = New ClsMov
    'primero ELIMINA el pago asignado a la factura
    pago.EliminaDeFactura codig
    'modifica la factura
    Me.Modificar codig, Me.codNodo, Me.codSucursal, Me.codCobrador, _
                 Me.fecha, Me.numero, "0", Me.nroautorizacion, "0", "ANULADA", _
                 "ANULADA", "0", Me.fecha_limite, "1", Me.fecha_reporte, "1", "ANULADA", "1"
    'elimina los abonos de la factura
    abono.consultaXFactura codig, "2"
    
    'elimina todos los abonos, pero antes pone los cargos por cobrar(si NO se hubieran generado con esta factura)
    sq.reset
    sq.setCampos Array(tra_id)
    sq.setTablas Array(tra)
    sq.setCondiciones Array(tra_fac_id & "='" & codig & "'")
    qAbo.consulta sq.sSelect
    condsCar = " IN ("
    For i = 1 To qAbo.orset.numRegistros
        condsCar = condsCar & "'" & qAbo.valores_fila(0) & "',"
        qAbo.orset.MoveNext
    Next
    condsCar = Left(condsCar, Len(condsCar) - 1)
    condsCar = condsCar & ")"
    
    If qAbo.orset.numRegistros > 0 Then
        'si existen abonos de esta factura
        sq.reset
        sq.setCampos Array(mca_tra_car_id, tra_tipo_comprobante)
        sq.setTablas Array(mca, tra)
        sq.setCondiciones Array(mca_tra_abo_id & condsCar, _
                                mca_tra_car_id & "=" & tra_id)
        qCar.consulta sq.sSelect
        'consultando los cargos
        For i = 1 To qCar.orset.numRegistros
            'si se habian generado con una factura, se elimina el registro
            If Trim(qCar.valores_fila(1)) = "F" Then
                'borrando los detalles
                    sq.reset
                    sq.setTablas Array(tdt)
                    sq.setCondiciones Array(tdt_tra_id & "='" & qCar.valores_fila(0) & "'")
                    '//TODO arreglar con clases
                    'qAux.ejecuta sq.sDelete
                'borrando la relacion con los abonos
                    sq.reset
                    sq.setTablas Array(mca)
                    sq.setCondiciones Array(mca_tra_car_id & "='" & qCar.valores_fila(0) & "'")
                    '//TODO arreglar con clases
                    'qAux.ejecuta sq.sDelete
                'jamas deberia ejecutar los siguientes querys:
                '2. de la venta automatica, ya que todas las ventas automatica se generan con nota de debito
                    sq.reset
                    sq.setTablas Array(tva)
                    sq.setCondiciones Array(tva_tra_id & "='" & qCar.valores_fila(0) & "'")
                    '//TODO arreglar con clases
                    'qAux.ejecuta sq.sDelete
                'eliminando el abono
                cargo.Borrar Trim(qCar.valores_fila(0))
            Else
                'los pone por cobrar
                cargo.PorCobrar Trim(qCar.valores_fila(0))
            End If
            qCar.orset.MoveNext
        Next
        'finalmente borra los abonos
        qAbo.orset.MoveFirst
        For i = 1 To qAbo.orset.numRegistros
            abono.Borrar Trim(qAbo.valores_fila(0))
            qAbo.orset.MoveNext
        Next
    Else
        '//TODO=================================================================
        'verificar si se modifica los abonos al anular una factura de una gestion pasada
        'y como se modifican los abonos o si se ponen como cancelados, etc
        'PROPUESTA => la factura que tenga los abonos y todas las demas facturas en las diferentes gestiones deberian anularse
        '          => asi se mantiene la integridad de los libros de ventas
    End If
End Sub

'general procedures
Public Sub Nuevo(newNodId As String, newSfaId As String, newCobId As String, newFecha As String, newNumero As String, newCodcontrol As String, newNroautorizacion As String, newNit As String, newRazon As String, newConcepto As String, newImporte As String, newFechaLimite As String, newAnulada As String, newFechaReporte As String, newCancelada As String, newObservaciones As String, newImpresa As String)
    orset.sInsert Array("", newNodId, newSfaId, newCobId, newFecha, aumentaCeros(newNumero, 10), _
                        newCodcontrol, newNroautorizacion, newNit, UCase(newRazon), UCase(newConcepto), newImporte, newFechaLimite, _
                        formatBoolBD(newAnulada), newFechaReporte, formatBoolBD(newCancelada), UCase(newObservaciones), formatBoolBD(newImpresa))
End Sub
Public Sub Modificar(codig As String, newNodId As String, newSfaId As String, newCobId As String, newFecha As String, newNumero As String, newCodcontrol As String, newNroautorizacion As String, newNit As String, newRazon As String, newConcepto As String, newImporte As String, newFechaLimite As String, newAnulada As String, newFechaReporte As String, newCancelada As String, newObservaciones As String, newImpresa As String)
    orset.sUpdate Array(codig, newNodId, newSfaId, newCobId, newFecha, aumentaCeros(newNumero, 10), _
                        newCodcontrol, newNroautorizacion, newNit, UCase(newRazon), UCase(newConcepto), newImporte, newFechaLimite, _
                        formatBoolBD(newAnulada), newFechaReporte, formatBoolBD(newCancelada), UCase(newObservaciones), formatBoolBD(newImpresa))
End Sub
Public Sub Borrar(codig As String)
    orset.sDelete codig
End Sub
Private Sub Reload_members()
    With orset
        codigo = .getDato(fac_id)
        fecha = .getDato(fac_fecha)
        numero = .getDato(fac_numero)
        codControl = .getDato(fac_codcontrol)
        nroautorizacion = .getDato(fac_nroautorizacion)
        nit = .getDato(fac_nit)
        razon = .getDato(fac_razon)
        concepto = .getDato(fac_concepto)
        importe = .getDato(fac_importe)
        fecha_limite = .getDato(fac_fecha_limite)
        anulada = .getDato(fac_anulada)
        fecha_reporte = .getDato(fac_fecha_reporte)
        cancelada = .getDato(fac_cancelada)
        observaciones = .getDato(fac_observaciones)
        impresa = .getDato(fac_impresa)
        codCobrador = .getDato(fac_cob_id)
        codNodo = .getDato(fac_nod_id)
        codSucursal = .getDato(fac_sfa_id)
    End With
    RaiseEvent DataChanged
End Sub

Private Sub orset_DataChanged()
    Reload_members
End Sub
